/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Colecciones;

import Modelo.AtributoValor;
import Modelo.PsAddresses;
import Modelo.PsEmailAddresses;
import Modelo.EstructuraFila;
import Modelo.Fila;
import Modelo.Path;
import Modelo.PsPersonalData;
import Modelo.PsPersDataEFFDT;
import Modelo.PsNames;
import Modelo.PsAddressType;
import Modelo.PsPersNamesType;
import Modelo.PsPersNid;
import Modelo.PsPersonalPhone;
import Modelo.TransaccionSql;
import com.puj.bdutils.ConnectorBD;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Vector;

/**
 * contiene las rutinas requeridas para crear y agregar atributos a un empleado.
 *
 * @author alexhd
 */
public class TestInsertarPersona {

    /*** Se debe revisar de acuerdo al cambio de version de People**/

    /**
     *
     * @param nombre
     * @param apellidos
     * @return
     */
    private static PsNames createPsNames(
            String nombre,
            String apellidos) {
        PsNames psNames = new PsNames("");
        if (Utils.notEmpty(nombre)) {
            psNames.setFirst_name(nombre);
        }
        if (Utils.notEmpty(apellidos)) {
            psNames.setLast_name(apellidos);
        }
        if (Utils.notEmpty(nombre)) {
            String srchStr = Utils.quitaTildes(nombre);
            srchStr = Utils.quitaEspacios(srchStr);
            psNames.setFirst_name_srch(srchStr.toUpperCase());
        }
        if (Utils.notEmpty(apellidos)) {
            String srchStr = Utils.quitaTildes(apellidos);
            srchStr = Utils.quitaEspacios(srchStr);
            psNames.setLast_name_srch(srchStr.toUpperCase());
        }
        return psNames;
    }

    /**
     *
     * @param pais_nacimiento
     * @param estado_nacimiento
     * @param ciudad_de_nacimiento
     * @param nombre
     * @param apellidos
     * @return
     */
    private static PsPersDataEFFDT createPsPersDataEFFDT(
            String pais_nacimiento,
            String estado_nacimiento,
            String ciudad_de_nacimiento,
            String nombre,
            String apellidos) {
        PsPersDataEFFDT psPersDataEFFDT = new PsPersDataEFFDT("");
        if (Utils.notEmpty(pais_nacimiento)) {
            psPersDataEFFDT.setCountry(pais_nacimiento);
        }
        if (Utils.notEmpty(estado_nacimiento)) {
            psPersDataEFFDT.setState(estado_nacimiento);
        }
        if (Utils.notEmpty(ciudad_de_nacimiento)) {
            psPersDataEFFDT.setCity(ciudad_de_nacimiento);
        }
        if (Utils.notEmpty(nombre)) {
            psPersDataEFFDT.setFirst_name(nombre);
        }
        if (Utils.notEmpty(apellidos)) {
            psPersDataEFFDT.setLast_name(apellidos);
        }
        if (Utils.notEmpty(nombre)) {
            psPersDataEFFDT.setFirst_name_srch(nombre);
        }
        if (Utils.notEmpty(apellidos)) {
            psPersDataEFFDT.setLast_name_srch(apellidos);
        }

        return psPersDataEFFDT;
    }

    /**
     *
     * @param pais_documento
     * @param tipo_doc
     * @param nro_doc
     * @return
     */
    private static PsPersNid createPsPersNid(
            String pais_documento,
            String tipo_doc,
            String nro_doc) {
        PsPersNid psPersNid = new PsPersNid("");
        if (Utils.notEmpty(pais_documento)) {
            psPersNid.setCountry(pais_documento);
        }
        if (Utils.notEmpty(tipo_doc)) {
            psPersNid.setNational_id_type(tipo_doc);
        }
        if (Utils.notEmpty(nro_doc)) {
            psPersNid.setNational_id(nro_doc);
        }
        return psPersNid;
    }

    /**
     *
     * @param nombre
     * @param apellidos
     * @param genero
     * @param fecha_nacimiento
     * @param ciudad_de_nacimiento
     * @param estado_civil
     * @param pais_nacimiento
     * @param estado_nacimiento
     * @param ciudad_de_residencia
     * @param direccion_de_residencia
     * @param telefono_de_residencia
     * @param universidad
     * @return
     */
    private static PsPersonalData createPsPersonalData(
            String nombre,
            String apellidos,
            String genero,
            String fecha_nacimiento,
            String ciudad_de_nacimiento,
            String estado_civil,
            String pais_nacimiento,
            String estado_nacimiento,
            String ciudad_de_residencia,
            String direccion_de_residencia,
            String telefono_de_residencia,
            String universidad) {
        PsPersonalData psPersonalData = new PsPersonalData("");
        if (Utils.notEmpty(nombre)) {
            psPersonalData.setName(nombre);
        }
        if (Utils.notEmpty(apellidos)) {
            psPersonalData.setApplid(apellidos);
        }
        if (Utils.notEmpty(genero)) {
            psPersonalData.setSex(genero);
        }
        if (Utils.notEmpty(fecha_nacimiento)) {
            psPersonalData.setBirthd(fecha_nacimiento);
        }
        if (Utils.notEmpty(ciudad_de_nacimiento)) {
            psPersonalData.setBirthplace(ciudad_de_nacimiento);
        }
        if (Utils.notEmpty(estado_civil)) {
            psPersonalData.setMar_status(estado_civil);
        }
        if (Utils.notEmpty(pais_nacimiento)) {
            psPersonalData.setCountry(pais_nacimiento);
        }
        if (Utils.notEmpty(estado_nacimiento)) {
            psPersonalData.setState(estado_nacimiento);
        }
        if (Utils.notEmpty(ciudad_de_residencia)) {
            psPersonalData.setCity(ciudad_de_residencia);
        }
        if (Utils.notEmpty(direccion_de_residencia)) {
            psPersonalData.setAddress1(direccion_de_residencia);
        }
        if (Utils.notEmpty(telefono_de_residencia)) {
            psPersonalData.setPhone(telefono_de_residencia);
        }
        if (Utils.notEmpty(universidad)) {
            psPersonalData.setCampus_id(universidad);
        }
        return psPersonalData;
    }

    /**
     *
     * @param indicativo
     * @param telefono
     * @param extension
     * @param preference
     * @param tipoTelefono
     * @return
     */
    private static PsPersonalPhone createPsPersonalPhone(
            String indicativo,
            String telefono,
            String extension,
            String preference,
            String tipoTelefono) {
        PsPersonalPhone psPhoneNumber = null;
        if (Utils.notEmpty(telefono)) {
            psPhoneNumber = new PsPersonalPhone("");
            psPhoneNumber.setPhone_type(tipoTelefono);
            if (Utils.notEmpty(indicativo)) {
                psPhoneNumber.setCountry_code(indicativo);
            }
            psPhoneNumber.setPhone(telefono);
            if (Utils.notEmpty(extension)) {
                psPhoneNumber.setExtension(extension);
            }
            if (Utils.notEmpty(preference)) {
                if (tipoTelefono.equals(preference)) {
                    psPhoneNumber.setPref_phone_flag("Y");
                } else {
                    psPhoneNumber.setPref_phone_flag("N");
                }
            } else {
                psPhoneNumber.setPref_phone_flag("N");
            }
        }
        return psPhoneNumber;
    }

    private TestInsertarPersona() {
        // esta clase solo contiene elementos estaticos y no debe instanciarse
    }

    /**
     * inserta datos en la tabla PS_PERSONAL_DATA.
     * @param obj datos a insertar en la tabla
     * @throws Colecciones.MetadataException
     * @throws java.lang.IllegalAccessException
     * @throws java.lang.reflect.InvocationTargetException
     * @throws java.sql.SQLException
     */
    public static void insertar(PsPersonalData obj/*, Connection conn*/) throws MetadataException, IllegalAccessException, InvocationTargetException, SQLException {
        EstructuraFila ef = PsPersonalData.getEstructuraFila();
        String tableName = PsPersonalData.getTableName();  //"PS_PERS_DATA_EFFDT";
        String strInsert = Utils.getInsertString(obj, ef, tableName);

        Utils.write("Cadena de insert : " + strInsert);
    //TransaccionSql.insertar(strInsert); //, conn);
    }

    /**
     * inserta datos en la tabla PS_ADDRESSES
     * @param obj datos a insertar en la tabla
     * @throws Colecciones.MetadataException
     * @throws java.lang.IllegalAccessException
     * @throws java.lang.reflect.InvocationTargetException
     * @throws java.sql.SQLException
     */
    public static void insertar(PsAddresses obj/*, Connection conn*/) throws MetadataException, IllegalAccessException, InvocationTargetException, SQLException {
        EstructuraFila ef = PsAddresses.getEstructuraFila();
        String tableName = PsAddresses.getTableName();  //"PS_PERS_DATA_EFFDT";
        String strInsert = Utils.getInsertString(obj, ef, tableName);

        Utils.write("Cadena de insert : " + strInsert);
    //TransaccionSql.insertar(strInsert); //, conn);
    }

    /**
     * inserta datos en la tabla PS_ADDRESS_TYPE
     * @param obj datos a insertar en la tabla
     * @param conn conexiÃ³n obtenida de ConnectorBD
     * @throws Colecciones.MetadataException
     * @throws java.lang.IllegalAccessException
     * @throws java.lang.reflect.InvocationTargetException
     * @throws java.sql.SQLException
     */
    private static void insertar(PsAddressType obj/*, Connection conn*/) throws MetadataException, IllegalAccessException, InvocationTargetException, SQLException {
        EstructuraFila ef = PsAddressType.getEstructuraFila();
        String tableName = PsAddressType.getTableName();  //"PS_PERS_DATA_EFFDT";
        String strInsert = Utils.getInsertString(obj, ef, tableName);

        Utils.write("Cadena de insert : " + strInsert);
    //TransaccionSql.insertar(strInsert); //, conn);
    }

    /**
     * inserta datos en la tabla PS_EMAIL_ADDRESSES
     * @param obj datos a insertar en la tabla
âˆ«     * @throws Colecciones.MetadataException
     * @throws java.lang.IllegalAccessException
     * @throws java.lang.reflect.InvocationTargetException
     * @throws java.sql.SQLException
     */
    public static void insertar(PsEmailAddresses obj/*, Connection conn*/) throws MetadataException, IllegalAccessException, InvocationTargetException, SQLException {
        EstructuraFila ef = PsEmailAddresses.getEstructuraFila();
        String tableName = PsEmailAddresses.getTableName();  //"PS_PERS_DATA_EFFDT";
        String strInsert = Utils.getInsertString(obj, ef, tableName);

        Utils.write("Cadena de insert : " + strInsert);
    //TransaccionSql.insertar(strInsert); //, conn);
    }

    /**
     * inserta datos en la tabla PS_PERS_DATA_EFFDT
     * @param obj datos a insertar en la tabla
     * @throws Colecciones.MetadataException
     * @throws java.lang.IllegalAccessException
     * @throws java.lang.reflect.InvocationTargetException
     * @throws java.sql.SQLException
     */
    public static void insertar(PsPersDataEFFDT obj/*, Connection conn*/) throws MetadataException, IllegalAccessException, InvocationTargetException, SQLException {
        EstructuraFila ef = PsPersDataEFFDT.getEstructuraFila();
        String tableName = PsPersDataEFFDT.getTableName();  //"PS_PERS_DATA_EFFDT";
        String strInsert = Utils.getInsertString(obj, ef, tableName);

        Utils.write("Cadena de insert : " + strInsert);
    //TransaccionSql.insertar(strInsert); //, conn);
    }

    /**
     * inserta datos en la tabla PS_NAMES
     * @param obj datos a insertar en la tabla
     * @throws Colecciones.MetadataException
     * @throws java.lang.IllegalAccessException
     * @throws java.lang.reflect.InvocationTargetException
     * @throws java.sql.SQLException
     */
    public static void insertar(PsNames obj/*, Connection conn*/) throws MetadataException, IllegalAccessException, InvocationTargetException, SQLException {
        EstructuraFila ef = PsNames.getEstructuraFila();
        String tableName = PsNames.getTableName();  //"PS_PERS_DATA_EFFDT";
        String strInsert = Utils.getInsertString(obj, ef, tableName);

        Utils.write("Cadena de insert : " + strInsert);
    //TransaccionSql.insertar(strInsert); //, conn);
    }

    /**
     * inserta datos en la tabla PS_PERS_NAME_TYPE
     * @param obj datos a insertar en la tabla
     * @throws Colecciones.MetadataException
     * @throws java.lang.IllegalAccessException
     * @throws java.lang.reflect.InvocationTargetException
     * @throws java.sql.SQLException
     */
    public static void insertar(PsPersNamesType obj/*, Connection conn*/) throws MetadataException, IllegalAccessException, InvocationTargetException, SQLException {
        EstructuraFila ef = PsPersNamesType.getEstructuraFila();
        String tableName = PsPersNamesType.getTableName();  //"PS_PERS_DATA_EFFDT";
        String strInsert = Utils.getInsertString(obj, ef, tableName);

        Utils.write("Cadena de insert : " + strInsert);
    //TransaccionSql.insertar(strInsert); //, conn);
    }

    /**
     * inserta datos en la tabla PS_PERSONAL_PHONE
     * @param obj datos a insertar en la tabla
     * @throws Colecciones.MetadataException
     * @throws java.lang.IllegalAccessException
     * @throws java.lang.reflect.InvocationTargetException
     * @throws java.sql.SQLException
     */
    public static void insertar(PsPersonalPhone obj/*, Connection conn*/) throws MetadataException, IllegalAccessException, InvocationTargetException, SQLException {
        EstructuraFila ef = PsPersonalPhone.getEstructuraFila();
        String tableName = PsPersonalPhone.getTableName();  //"PS_PERS_DATA_EFFDT";
        String strInsert = Utils.getInsertString(obj, ef, tableName);

        Utils.write("Cadena de insert : " + strInsert);
    //TransaccionSql.insertar(strInsert); //, conn);
    }

    /**
     * inserta datos en la tabla PS_PERS_NID
     * @param obj datos a insertar en la tabla
     * @param conn conexiÃ³n obtenida de ConnectorBD
     * @throws Colecciones.MetadataException
     * @throws java.lang.IllegalAccessException
     * @throws java.lang.reflect.InvocationTargetException
     * @throws java.sql.SQLException
     */
    private static void insertar(PsPersNid obj/*, Connection conn*/) throws MetadataException, IllegalAccessException, InvocationTargetException, SQLException {
        EstructuraFila ef = PsPersNid.getEstructuraFila();
        String tableName = PsPersNid.getTableName();  //"PS_PERS_DATA_EFFDT";
        String strInsert = Utils.getInsertString(obj, ef, tableName);

        Utils.write("Cadena de insert : " + strInsert);
    //TransaccionSql.insertar(strInsert); //, conn);
    }

    /**
     * actualiza las estructuras de PS_EMAIL_ADDRESSES asociadas al emplid con
     * PREF_EMAIL_FLAG = 'N' y crea una nueva estructura de PS_EMAIL_ADDRESSES
     * asociada el emplid predeterminada.
     * @param obj datos que se van a modificar en la tabla
     * @throws java.sql.SQLException
     * @throws MetadataException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     */
    public static void modificar(PsEmailAddresses obj/*, Connection conn*/) throws SQLException, MetadataException, IllegalAccessException, InvocationTargetException {
        String emplid = obj.getEmplid().valor;
        String strUpdate = "UPDATE PS_EMAIL_ADDRESSES SET PREF_EMAIL_FLAG = 'N' WHERE EMPLID = " + emplid;
        TransaccionSql.actualizar(strUpdate); //, conn);
        insertar(obj); //, conn);
    }

    /**
     * modificar para las tablas de : PS_ADDRESSES y PS_PERSONAL_PHONE
     * @param obj
     * @param tableName
     * @param emplid
     * @throws java.sql.SQLException
     * @throws Exception
     */
    public static void modificar(Fila obj, String tableName, String emplid/*, Connection conn*/) throws SQLException, Exception {

        String strUpdate = "UPDATE " + tableName + " SET";
        for (int i = 0; i < obj.size(); i++) {
            AtributoValor av = obj.getAtributoValor(i);
            strUpdate += av.getAtributo() + " = '" + av.getValor() + "' ";
        }
        strUpdate += "WHERE EMPLID = " + emplid;
        TransaccionSql.actualizar(strUpdate); //, conn);
    }

    /**
     * realiza todas las operaciones para crear una persona.
     * @param psPersonalData
     * @param psEmailAddresses
     * @param psAddresses
     * @param psAddressType
     * @param psPersonalPhone
     * @param psPersonalDataEFFDT
     * @param psNames
     * @param psPersNamesType
     * @param psPersNid
     */
    public synchronized static void crearPersona(
            PsPersonalData psPersonalData,
            Vector<PsEmailAddresses> psEmailAddresses,
            PsAddresses psAddresses,
            PsAddressType psAddressType,
            Vector<PsPersonalPhone> psPersonalPhone,
            PsPersDataEFFDT psPersonalDataEFFDT,
            PsNames psNames,
            PsPersNamesType psPersNamesType,
            PsPersNid psPersNid) {
//        Connection conn = null;
        try {
//            conn = null; // ConnectorBD.getConnection(Path.ruta);
//            TransaccionSql.iniciarTransaccion();//conn);

            //String emplid = Empleado.getNewEmplId();//conn);
            String emplid = "99999999";

            psPersonalData.setEmplid(emplid);
            // creaciÃ³n de usuario validacion correo electronico
            if (psEmailAddresses != null) {
                for (PsEmailAddresses psEmailAddress : psEmailAddresses) {
                    psEmailAddress.setEmplid(emplid);
                }
            }
            // creaciÃ³n de usuario validacion direccion
            if (psAddresses != null) {
                psAddresses.setEmplid(emplid);
                if (psAddressType != null) {
                    psAddressType.setEmplid(emplid);
                }
            }
            // creaciÃ³n de usuario validacion telefono
            if (psPersonalPhone != null) {
                for (PsPersonalPhone psPersPhone : psPersonalPhone) {
                    psPersPhone.setEmplid(emplid);
                }
            }
            psPersonalDataEFFDT.setEmplid(emplid);
            psNames.setEmplid(emplid);
            psPersNamesType.setEmplid(emplid);
            psPersNid.setEmplid(emplid);

            insertar(psPersonalData); //, conn);
            // creaciÃ³n de usuario validacion correo electronico
            if (psEmailAddresses != null) {
                for (PsEmailAddresses psEmailAddress : psEmailAddresses) {
                    insertar(psEmailAddress); //, conn);
                }
            }
            // creaciÃ³n de usuario validacion direccion
            if (psAddresses != null) {
                psAddresses.setEmplid(emplid);
                psAddressType.setEmplid(emplid);
                insertar(psAddresses); //, conn);
                insertar(psAddressType); //, conn);
            }
            // creaciÃ³n de usuario validacion telefono
            if (psPersonalPhone != null) {
                for (PsPersonalPhone psPersPhone : psPersonalPhone) {
                    insertar(psPersPhone); //, conn);
                }
            }
            insertar(psPersonalDataEFFDT); //, conn);
            insertar(psNames); //, conn);
            insertar(psPersNamesType); //, conn);
            insertar(psPersNid); //, conn);

//            TransaccionSql.terminarTransaccion(conn);

        } catch (SQLException ex) {
            // en el caso de un error de la base de datos.
//            TransaccionSql.limpiarTransaccion(conn);
//            System.out.write("error : " + ex.getMessage());
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            // se presenta en caso de intentar acceder a un metodo al que no se tienen privilegios.
//            TransaccionSql.limpiarTransaccion(conn);
//            System.out.write("error : " + ex.getMessage());
            ex.printStackTrace();
        } catch (InvocationTargetException ex) {
            // invocaciÃ³n de un metodo sin tener los argumentos adecuados
//            TransaccionSql.limpiarTransaccion(conn);
//            System.out.write("error : " + ex.getMessage());
            ex.printStackTrace();
        } catch (MetadataException ex) {
            // en el caso de intentar acceder a un metodo inexistente.
//            TransaccionSql.limpiarTransaccion(conn);
//            System.out.write("error : " + ex.getMessage());
            ex.printStackTrace();
        } finally {
//            try {
//                conn.close();
//            } catch (SQLException ex) {
//                System.out.write("error : " + ex.getMessage());
//            }
        }
    }

    /**
     *
     * @param nombre
     * @param apellidos
     * @param tipo_doc
     * @param nro_doc
     * @param genero
     * @param edad
     * @param fecha_nacimiento
     * @param estado_civil
     * @param ciudad_de_nacimiento
     * @param ciudad_de_residencia
     * @param telefono_de_residencia
     * @param direccion_de_residencia
     * @param empresa
     * @param ciudad_de_empresa
     * @param nit_empresa
     * @param direccion_empresa
     * @param telefono_empresa
     * @param fax_empresa
     * @param cargo_empresa
     * @param sector_empresa
     * @param contacto_empresa
     * @param institucion
     * @param colegio
     * @param universidad
     * @param profesion
     * @param pais_nacimiento
     * @param estado_nacimiento
     * @param correo_personal
     * @param correo_empresa
     * @param correo_pref_flag
     * @param pais_empresa
     * @param estado_empresa
     * @param indicativo_telefono_de_residencia
     * @param indicativo_telefono_empresa
     * @param indicativo_fax_empresa
     * @param extension_telefono_de_residencia
     * @param extension_telefono_empresa
     * @param extension_fax_empresa
     * @param telefono_pref
     * @param tipo_de_nombre
     * @param pais_documento
     */
    public static void crearPersona(
            String nombre,
            String apellidos,
            String tipo_doc,
            String nro_doc,
            String genero,
            String edad,
            String fecha_nacimiento,
            String estado_civil,
            String ciudad_de_nacimiento,
            String ciudad_de_residencia,
            String telefono_de_residencia,
            String direccion_de_residencia,
            String empresa,
            String ciudad_de_empresa,
            String nit_empresa,
            String direccion_empresa,
            String telefono_empresa,
            String fax_empresa,
            String cargo_empresa,
            String sector_empresa,
            String contacto_empresa,
            String institucion,
            String colegio,
            String universidad,
            String profesion,
            // Aditional information
            // Alex RoldÃ¡n HD.
            String pais_nacimiento,
            String estado_nacimiento,
            String correo_personal,
            String correo_empresa,
            String correo_pref_flag,
            String pais_empresa,
            String estado_empresa,
            String indicativo_telefono_de_residencia,
            String indicativo_telefono_empresa,
            String indicativo_fax_empresa,
            String extension_telefono_de_residencia,
            String extension_telefono_empresa,
            String extension_fax_empresa,
            String telefono_pref,
            String tipo_de_nombre,
            String pais_documento) {
        // PSPERSONALDATA <SECTION>
        PsPersonalData psPersonalData = createPsPersonalData(
                nombre,
                apellidos,
                genero,
                fecha_nacimiento,
                ciudad_de_nacimiento,
                estado_civil,
                pais_nacimiento,
                estado_nacimiento,
                ciudad_de_residencia,
                direccion_de_residencia,
                telefono_de_residencia,
                universidad);

        // PS_EMAIL_ADDRESSES <SECTION>
        Vector<PsEmailAddresses> psEmailAddresses = new Vector<PsEmailAddresses>();

        if (Utils.notEmpty(correo_personal)) {
//        if (correo_personal.trim().length() > 0)
            PsEmailAddresses psEmailAddr = new PsEmailAddresses("");
            psEmailAddr.setE_addr_type("HOME");
            psEmailAddr.setEmail_addr(correo_personal);
            if (Utils.notEmpty(correo_pref_flag)) {
                if ("HOME".equals(correo_pref_flag)) {
                    psEmailAddr.setPref_email_flag("Y");
                } else {
                    psEmailAddr.setPref_email_flag("N");
                }
            } else {
                psEmailAddr.setPref_email_flag("Y");
            }
            psEmailAddresses.add(psEmailAddr);
        }
        if (Utils.notEmpty(correo_empresa)) {
//        if (correo_empresa.trim().length() > 0)
            PsEmailAddresses psEmailAddr = new PsEmailAddresses("");
            psEmailAddr.setE_addr_type("BUSN");
            psEmailAddr.setEmail_addr(correo_empresa);
            if (Utils.notEmpty(correo_pref_flag)) {
                if ("BUSN".equals(correo_pref_flag)) {
                    psEmailAddr.setPref_email_flag("Y");
                } else {
                    psEmailAddr.setPref_email_flag("N");
                }
            } else {
                psEmailAddr.setPref_email_flag("N");
            }
            psEmailAddresses.add(psEmailAddr);
        }

        // PS_ADDRESSES <SECTION>
        PsAddresses psAddresses = null;
        PsAddressType psAddressType = null;

        if (Utils.notEmpty(direccion_empresa)) {
//        if (direccion_empresa.trim().length() > 0) {
            psAddresses = new PsAddresses("");
            psAddresses.setAddress_type("BUSN");
            if (Utils.notEmpty(pais_empresa)) {
                psAddresses.setCountry(pais_empresa);
            }
            if (Utils.notEmpty(estado_empresa)) {
                psAddresses.setState(estado_empresa);
            }
            if (Utils.notEmpty(ciudad_de_empresa)) {
                psAddresses.setCity(ciudad_de_empresa);
            }
            psAddresses.setEff_status("A");
            if (Utils.notEmpty(direccion_empresa)) {
                psAddresses.setAddress1(direccion_empresa);
            }
            psAddressType = new PsAddressType("");
            psAddressType.setAddress_type("BUSN");
        }

        // PS_PERSONAL_PHONE <SECTION>
        Vector<PsPersonalPhone> psPersonalPhone = new Vector<PsPersonalPhone>();

        {
            PsPersonalPhone psPhoneNumber = createPsPersonalPhone(
                    indicativo_telefono_de_residencia,
                    telefono_de_residencia,
                    extension_telefono_de_residencia,
                    telefono_pref,
                    "HOME");
            if (psPhoneNumber != null) {
                psPersonalPhone.add(psPhoneNumber);
            }
        }
        {
            PsPersonalPhone psPhoneNumber = createPsPersonalPhone(
                    indicativo_telefono_empresa,
                    telefono_empresa,
                    extension_telefono_empresa,
                    telefono_pref,
                    "BUSN");
            if (psPhoneNumber != null) {
                psPersonalPhone.add(psPhoneNumber);
            }
        }
        {
            PsPersonalPhone psPhoneNumber = createPsPersonalPhone(
                    indicativo_fax_empresa,
                    fax_empresa,
                    extension_fax_empresa,
                    telefono_pref,
                    "FAX");
            if (psPhoneNumber != null) {
                psPersonalPhone.add(psPhoneNumber);
            }
        }

        // PS_PERS_DATA_EFFDT <SECTION>
        PsPersDataEFFDT psPersDataEFFDT = createPsPersDataEFFDT(
                pais_nacimiento,
                estado_nacimiento,
                ciudad_de_nacimiento,
                nombre,
                apellidos);

        // PS_NAMES <SECTION>
        PsNames psNames = createPsNames(
                nombre,
                apellidos);

        // PS_PERS_NAMES_TYPE <SECTION>
        PsPersNamesType psPersNamesType = new PsPersNamesType("");
        if (Utils.notEmpty(tipo_de_nombre)) {
            psPersNamesType.setName_type(tipo_de_nombre);
        }

        // PS_PERS_NID <SECTION>
        PsPersNid psPersNid = createPsPersNid(
                pais_documento,
                tipo_doc,
                nro_doc);

        crearPersona(
                psPersonalData,
                psEmailAddresses,
                psAddresses,
                psAddressType,
                psPersonalPhone,
                psPersDataEFFDT,
                psNames,
                psPersNamesType,
                psPersNid);
    }

    /**
     * interfaz de modificaciÃ³n de usuario para Illustrato
     * @param emplid
     * @param correo_electronico
     * @param tipo_correo_electronico HOME, BUSN, ...
     * @param direccion_de_residencia
     * @param telefono_de_residencia
     */
    public static void modificarPersona(
            String emplid,
            String correo_electronico,
            String tipo_correo_electronico,
            String direccion_de_residencia,
            String telefono_de_residencia) {

        PsEmailAddresses psEmailAddresses = new PsEmailAddresses("");
        psEmailAddresses.setEmplid(emplid);
        psEmailAddresses.setPref_email_flag("Y");
        psEmailAddresses.setEmail_addr(correo_electronico);
        psEmailAddresses.setE_addr_type(tipo_correo_electronico);

        Fila filaPersonalData = new Fila();
        try {
            filaPersonalData.adicionar("ADDRESS1", direccion_de_residencia);
            filaPersonalData.adicionar("PHONE", telefono_de_residencia);

        } catch (Exception ex) {
            Utils.write("error : " + ex.getMessage());
        }

        modificarPersona(emplid,
                psEmailAddresses,
                filaPersonalData);

    }

    /**
     * Logica de actualizaciones.
     * @param emplid
     * @param psEmailAddresses
     * @param filaPersonalData
     */
    public static void modificarPersona(
            String emplid,
            PsEmailAddresses psEmailAddresses,
            Fila filaPersonalData) {
        Connection conn = null;
        try {
            conn = ConnectorBD.getConnection(Path.ruta);
//            TransaccionSql.iniciarTransaccion(); //conn);
            if (psEmailAddresses != null) {
                modificar(psEmailAddresses); //, conn);
            }

            if (filaPersonalData != null) {
                modificar(filaPersonalData,
                        PsPersonalData.getTableName(),
                        emplid); //, conn);
            }
//            TransaccionSql.terminarTransaccion(); //conn);
        } catch (SQLException ex) {
            // en el caso de un error de la base de datos.
//            TransaccionSql.limpiarTransaccion(conn);
//            System.out.write("error : " + ex.getMessage());
            ex.printStackTrace();
        } catch (MetadataException ex) {
//            TransaccionSql.limpiarTransaccion(conn);
//            System.out.write("error : " + ex.getMessage());
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
//            TransaccionSql.limpiarTransaccion(conn);
//            System.out.write("error : " + ex.getMessage());
            ex.printStackTrace();
        } catch (InvocationTargetException ex) {
//            TransaccionSql.limpiarTransaccion(conn);
//            System.out.write("error : " + ex.getMessage());
            ex.printStackTrace();
        } catch (Exception ex) {
//            TransaccionSql.limpiarTransaccion(conn);
//            System.out.write("error : " + ex.getMessage());
            ex.printStackTrace();
        } finally {
//            try {
//                conn.close();
//            } catch (SQLException ex) {
//                System.out.write("error : " + ex.getMessage());
//            }
        }
    }

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        //    , , , "", "", "", "", "", "76020", "44444444", "calle", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "imct83@gmail.com", "", "", "", "", "", "", "", "", "", "", "", "", ""
        String nombre = "IvÃ³n Maritza";
        String apellidos = "CÃ©ter TascÃ³n";
        String tipo_doc = "CC";
        String nro_doc = "39656565";
        String genero = " ";
        String edad = " ";
        String fecha_nacimiento = " ";
        String estado_civil = " ";
        String ciudad_de_nacimiento = " ";
        String ciudad_de_residencia = "76020";
        String telefono_de_residencia = "8464737";
        String direccion_de_residencia = " ";
        String empresa = " ";
        String ciudad_de_empresa = " ";
        String nit_empresa = " ";
        String direccion_empresa = " ";
        String telefono_empresa = " ";
        String fax_empresa = " ";
        String cargo_empresa = " ";
        String sector_empresa = " ";
        String contacto_empresa = " ";
        String institucion = " ";
        String colegio = " ";
        String universidad = " ";
        String profesion = " ";
        String pais_nacimiento = " ";
        String estado_nacimiento = " ";
        String correo_personal = "a@a";
        String correo_empresa = " ";
        //String correo_pref_flag = "HOME";
        String correo_pref_flag = "12345678";
        String pais_empresa = " "; // <- ojo
        String estado_empresa = " ";
        String indicativo_telefono_de_residencia = " ";
        String indicativo_telefono_empresa = " ";
        String indicativo_fax_empresa = " ";
        String extension_telefono_de_residencia = " ";
        String extension_telefono_empresa = " ";
        String extension_fax_empresa = " ";
        String telefono_pref = " ";
        String tipo_de_nombre = " ";
        String pais_documento = " ";
        //    crearPersona(nombre, apellidos, tipo_doc, nro_doc, genero, edad, fecha_nacimiento, estado_civil, ciudad_de_nacimiento, ciudad_de_residencia, telefono, direccion_de_residencia, empresa, ciudad_de_empresa, nit_empresa, direccion_empresa, telefono_empresa, fax_empresa, cargo_empresa, sector_empresa, contacto_empresa, institucion, colegio, universidad, profesion, pais_nacimiento, estado_nacimiento, correo_personal, correo_empresa, correo_pref_flag, pais_empresa, estado_empresa, indicativo, indicativo_telefono_empresa, indicativo_fax_empresa, extension, extension_telefono_empresa, extension_fax_empresa, preference, tipo_de_nombre, pais_documento);
        crearPersona("Ivon Maritza", "Ceter Tascon", "CC", "39656565", "", "", "", "", "", "76020", "44444444", "calle", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "imct83@gmail.com", "", "", "", "", "", "", "", "", "", "", "", "", "");
    }
}
